package extend.db;

import extend.db.transaction.Trans;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * db 管理类
 *<B>说明：</B>
 *<pre>
 *  事务,数据库连接,sql收集
 *</pre>
 *<B>示例：</B>
 *<pre>
 *  略
 *</pre>
 *<B>日志：</B>
 *<pre>
 *  略
 *</pre>
 *<B>注意事项：</B>
 *<pre>
 *  略
 *</pre>
 */
public class DbManager
{

    /**
     * 定义当前静态变量
     *<B>说明：</B>
     *<pre>
     *  用于单例
     *</pre>
     */
    protected static DbManager dbManager = null;

    /**
     * 事务连接
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    protected Map<String,DbConnection> transDb = new HashMap<>();

    protected ArrayList sqls = new ArrayList();


    /**
     * 数据库连接列表
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    protected Map<String,DbConnection> dbConnections = new HashMap<String,DbConnection>();

    /**
     * 数据库配置连接
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public Map<String,Object> dbOptions = new HashMap<String,Object>(){};

    public DbManager()
    {
        dbManager = this;
    }

    /**
     * 构造方法
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     * @param dbOptions
     */
    public DbManager(Map<String,Object> dbOptions)
    {
        if (dbOptions != null) {
            this.dbOptions.putAll(dbOptions);
        }

        dbManager = this;
    }

    /**
     * 创建db 管理对象
     *<B>说明：</B>
     *<pre>
     *  单例模式
     *</pre>
     * @return DbManager
     */
    public static DbManager get()
    {
        if (DbManager.dbManager == null) {
            new DbManager(null);
        }

        return DbManager.dbManager;
    }

    /**
     * 获取一个数据库连接
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     * @param dbKey 数据库连接key
     */
    public DbConnection getDbConnection(String dbKey)
    {
        // 判断连接是否已经存在
//        if (this.dbConnections.containsKey(dbKey)) {
//            return this.dbConnections.get(dbKey);
//        }

        // 创建DbConnection 连接对象
        if (!this.dbOptions.containsKey(dbKey)) {
            return null;
        }

        Map<String,Object> dbConnOption = (Map<String,Object>)this.dbOptions.get(dbKey);
        try {

            DbConnection dbConnection =  DbConnection.make(dbConnOption);
            this.dbConnections.put(dbKey,dbConnection);
            return dbConnection;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取当前数据库连接对象
     *<B>说明：</B>
     *<pre>
     * 每次数据库操作之前都必须调用此方法选择对应的数据库db
     *</pre>
     * @param isWrite 是否写
     * @param dbkey 数据库连接key
     * @return DbConnection
     */
    public DbConnection getDb(Boolean isWrite,String dbkey)
    {
        DbConnection dbConnection = this.getDbConnection(dbkey);

        // 如果是更新操作，则将当前的连接加入事务池
        if (isWrite && Trans.transOn()) {
            Trans.addTransDb(dbkey,dbConnection);
        }

        return dbConnection;
    }

    public void addSql(String sql)
    {
        System.out.println("sql:" + sql.toString());
        sqls.add(sql);
    }

    public String getLastSql()
    {
        if (sqls.size() > 0) {
            return (String)sqls.get(0);
        } else {
            return "";
        }
    }
}
